Parallel Extensions

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Стек и компоненты .NET Framework до версии 4.5 включительно.

Parallel Extensions (с англ. — «Параллельные расширения») — библиотека управляемого параллелизма, разработанная в результате сотрудничества Microsoft Research и группы CLR[1] в Microsoft. Библиотека была выпущена в версии 4.0 .NET Framework[2]. Она состоит из двух частей: Параллельный LINQ (PLINQ) и Библиотека параллельных задач (TPL)[3][4]. Она также состоит из набора структур данных координации (CDS) — наборов структур данных, используемых для синхронизации и координации выполнения параллельных задач[5].

Параллельный LINQ

[править | править код]

PLINQ или Parallel LINQ[6] распараллеливает выполнение запросов к объектам (LINQ для Объектов) и данным XML[7] (LINQ для XML). PLINQ предназначен для выявления параллелизма данных[англ.] с помощью запросов[3]. PLINQ может распараллелить любые вычисления над объектами, реализованные как запросы. Однако объекты должны реализовывать интерфейс IParallelEnumerable, который определяется самим PLINQ. Внутренне он использует для выполнения TPL[5].

Библиотека параллельных задач

[править | править код]

Библиотека параллельных задач (TPL[8]) — это компонент параллелизма задач[укр.] параллельных расширений .NET [9]. Она предоставляет параллельные конструкции, такие как параллельные циклы For и ForEach, с использованием обычных вызовов методов и делегатов, поэтому конструкции могут использоваться из любых языков интерфейса командной строки. Работа по порождению и завершению потока, а также масштабирование количества потоков в соответствии с количеством доступных процессоров выполняется самой библиотекой[4], используя планировщик постепенного захвата работы[10].

TPL также включает другие конструкции, такие как Задача и Будущее. Задача — это действие, которое может выполняться независимо от остальной части программы. В этом смысле она семантически эквивалентна потоку, за исключением того, что это более лёгкий объект и не требует дополнительных затрат на создание потока ОС. Задачи ставятся в очередь объектом Диспетчер задач и планируются для выполнения в нескольких потоках ОС в пуле потоков[англ.], когда приходит их очередь.

Будущее — это задача, которая возвращает результат. Результат вычисляется в фоновом потоке, инкапсулированном объектом Future, и буферизуется до тех пор, пока не будет получен[4]. Если будет сделана попытка получить результат до того, как он будет вычислен, то запрашивающий поток будет блокироваться до тех пор, пока результат не станет доступен[9].

Другой конструкцией TPL является класс Parallel. TPL предоставляет базовую форму структурированного параллелизма с помощью трёх статических методов в классе Parallel:

Parallel.Invoke
Параллельно выполняет массив делегатов Action, а затем ожидает их завершения
Parallel.For
Параллельный эквивалент цикла for в C#
Parallel.ForEach
Параллельный эквивалент цикла foreach в C#

Архитектура

[править | править код]

Основная концепция Параллельных расширений .NET — это Задача, которая представляет собой небольшой блок кода, обычно представленный как лямбда-функция, которая может выполняться независимо. Как PLINQ, так и TPL API предоставляют методы для создания Задач — PLINQ делит запрос на более мелкие Задачи, а методы Parallel.For, Parallel.ForEach и Parallel.Invoke разделяют цикл на задачи.

PFX включает объект Диспетчер задач, который планирует выполнение задач. Диспетчер задач содержит глобальную очередь задач, которые затем выполняются. Он также инкапсулирует несколько потоков, в которых выполняются Задачи. По умолчанию создаётся столько потоков, сколько процессоров (или ядер процессора) в системе, хотя это число может быть изменено вручную. Каждый поток связан с определённой для потока очередью Задач. В режиме ожидания каждый поток берёт пакет задач и помещает их в свою локальную очередь, где они затем выполняются по очереди. Если глобальная очередь пуста, поток будет искать Задачи в очередях своих одноранговых узлов и будет брать Задачи, которые находились в очереди дольше всех (постепенный захват задач). При выполнении Задачи будут выполняться независимо, при этом изменение состояния одной Задачи не зависит от других. В результате, если они используют общий ресурс, их всё равно необходимо синхронизировать вручную с помощью блокировок или других конструкций.

  1. Сокращение от Common Language Runtime (рус. Общеязыковая среда выполнения)
  2. Что нового в .NET Framework 4. Дата обращения: 21 сентября 2011. Архивировано 23 сентября 2011 года.
  3. 1 2 Программирование в эпоху параллелизма: Параллельное программирование с помощью PFX. Дата обращения: 16 октября 2007. Архивировано 2 мая 2008 года.
  4. 1 2 3 Журнал MSDN: Библиотека параллельных задач. Дата обращения: 16 октября 2007. Архивировано 14 октября 2007 года.
  5. 1 2 Июнь 2008 года. CTP — Параллельные расширения .NET FX. Дата обращения: 6 августа 2008. Архивировано 21 августа 2008 года.
  6. Сокращение от Language INtegrated Query (рус. Интегрированный языковой запрос)
  7. Сокращение от eXtensible Markup Language (рус. Расширяемый язык разметки)
  8. Сокращение от Task Parallel Library
  9. 1 2 Джо Даффи. Параллельное программирование в Windows. — 2009. — P. "887–929". — ISBN 978-0321434821.
  10. Даан Лейен; Вольфрам Шульте; Себастьян Буркхардт (2009). "Дизайн библиотеки параллельных задач". Уведомления ACM SIGPLAN. 44 (10): 227. CiteSeerX 10.1.1.146.4197. doi:10.1145/1639949.1640106.

Внешние ссылки

[править | править код]